﻿Imports System.Data
Imports System.Collections.ObjectModel



Public Enum TiposOrden
  DeudaXRango = 1
  Monto       = 2
  Nominal     = 3
End Enum



Public Class CAPIAssetAllocationServicio


    Public Function ActualizaBitacoraDECALOG(ByVal intId As Integer, ByVal intEstatus As Integer, ByVal intUsuario As Integer) As Boolean
        Try
            Return CServicioLocalSQLServerDB.ActualizaBitacoraDECALOG(intId, intEstatus, intUsuario)
        Catch ex As Exception
            Dim idRegBit As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "ActualizaBitacoraDECALOG", "Error al actualizar el estatus del folio Decalog: " & intId.ToString & ". Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(idRegBit)

            Return False
        End Try
    End Function

    Public Function ActualizaFolioDECALOG(ByVal intId As Integer, ByVal strFolio As String, ByVal intUsuario As Integer) As Boolean
        Try
            Return CServicioLocalSQLServerDB.ActualizaFolioDECALOG(intId, strFolio, intUsuario)
        Catch ex As Exception
            Dim idRegBit As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "ActualizaFolioDECALOG", "Error al actualizar el folio de Decalog: " & intId.ToString & ". Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(idRegBit)

            Return False
        End Try
    End Function

    Public Function ActualizaMensajeErrorDECALOG(ByVal intId As Integer, ByVal strMensaje As String, ByVal intUsuario As Integer) As Boolean
        Try
            Return CServicioLocalSQLServerDB.ActualizaMensajeErrorDECALOG(intId, strMensaje, intUsuario)
        Catch ex As Exception
            Dim idRegBit As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "ActualizaErrorDECALOG", "Error al actualizar el mensaje de error de Decalog: " & intId.ToString & ". Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(idRegBit)

            Return False
        End Try
    End Function

    Public Function ObtieneBitacoraDECALOG(ByVal strFechaInicio As String, ByVal strFechaFin As String) As List(Of CBitacoraDecalog)
        Try
            Dim dtDatos As DataTable = CServicioLocalSQLServerDB.ObtieneBitacoraDECALOG(28, strFechaInicio, strFechaFin)
            Dim lstBitacora As New List(Of CBitacoraDecalog)
            Dim b As CBitacoraDecalog

            If dtDatos.Rows.Count > 0 Then
                For Each dt As DataRow In dtDatos.Rows
                    b = New CBitacoraDecalog()
                    With b
                        .Id = Convert.ToInt32(dt(0))
                        .IdEstatus = Convert.ToInt32(dt(1))
                        .Estatus = Convert.ToString(dt(2))
                        .Archivo = Convert.ToString(dt(3))
                        .Folio = Convert.ToString(dt(4))
                        .Usuario = Convert.ToString(dt(5))
                        .Fecha = Convert.ToDateTime(dt(6))
                        .MensajeError = Convert.ToString(dt(7))
                        .DetalleError = Convert.ToString(dt(8))
                    End With
                    lstBitacora.Add(b)
                    b = Nothing
                Next
            End If

            Return lstBitacora
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Function ObtieneRutaTLOADERAPI() As String
        Return CServicioLocalSQLServerDB.ObtieneRutaTLOADERAPI()
    End Function

    Public Function ObtieneRutaArchivoAPI() As String
        Return CServicioLocalSQLServerDB.ObtieneRutaArchivoAPI()
    End Function

    Public Function ObtieneIDAPIDeudaRangos() As String
        Return CServiciosMacrosSyBaseDB.ObtieneIDAPIDeudaRangos()
    End Function

    Public Function ObtieneCamposAPIDeudaRangos(ByVal strID) As DataTable
        Return CServiciosMacrosSyBaseDB.ObtieneCamposAPIDeudaRangos(strID)
    End Function

    Public Function ObtieneFormatoAPI(ByVal intTipo As Integer, ByVal intSubtipo As Integer) As DataTable
        Return CServicioLocalSQLServerDB.ObtieneFormatoAPI(intTipo, intSubtipo)
    End Function

    Public Function InsertaBitacoraDECALOG(ByVal strNombreArchivo As String, ByVal intUsuario As Integer) As Integer
        Try
            Return CServicioLocalSQLServerDB.InsertaBitacoraDECALOG(28, strNombreArchivo, intUsuario)
        Catch ex As Exception
            Dim idRegBit As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "GuardarBitacoraDECALOG", "Error al guardar el folio Decalog para el archivo: " & strNombreArchivo & ". Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(idRegBit)

            Return 0
        End Try
    End Function

    Public Function ObtieneParametrosTLOADER() As String
        Return CServicioLocalSQLServerDB.ObtieneParametrosTLOADERAPI()
    End Function

    Public Function ActualizaDetalleErrorDECALOG(ByVal intId As Integer, ByVal strMensaje As String, ByVal intUsuario As Integer) As Boolean
        Try
            Return CServicioLocalSQLServerDB.ActualizaDetalleErrorDECALOG(intId, strMensaje, intUsuario)
        Catch ex As Exception
            Dim idRegBit As Integer = CUtileria.GrabarBitacora("APIAssetAllocation", "ActualizaDetalleErrorDECALOG", "Error al actualizar el detalle de error de Decalog: " & intId.ToString & ". Error: " & ex.Message)
            CUtileria.CompletarRegBitacora(idRegBit)

            Return False
        End Try
    End Function
    
    Public Sub ReglasLayout(ByVal tipoOrden As TiposOrden, ByRef Ordenes As ObservableCollection(Of COrden), ByRef sMsgError As String)

        
        sMsgError = ""

        Dim sMensajeError As String = ""

        Dim tipoValores = New System.Text.StringBuilder()
        Dim instrumentos = New System.Text.StringBuilder()
        Dim contratos = New System.Text.StringBuilder()
        Dim estrategias = New System.Text.StringBuilder()


        Dim dtContratosGXE As DataTable
        Dim dtContratos As DataTable
        Dim dtEstrategias As DataTable
        Dim dtMesas As DataTable

        Dim dtInstrumentos As DataTable
        Dim dtTiposValores As DataTable
        Dim FechaAux As Date = CServiciosMacrosSyBaseDB.FechaHoyDB()

        Try

            For Each orden As COrden In Ordenes


                sMensajeError = ""
                With orden


                    'Datos globales para los tipos de órdenes

                    If (.Contrato.Trim.Length <= 0 Or .Contrato.Trim.Length > 12) Then   'ID_POS 
                        sMensajeError = sMensajeError & "Valor de 'Contrato' incorrecto (Alfanumérico (12)) " & vbNewLine
                    End If

                    If (Not (.TipoOperacion.Equals("C") Or .TipoOperacion.Equals("V"))) Then
                        sMensajeError = sMensajeError & "Tipo Operación incorrecto: {'C','V'}) " & vbNewLine
                    End If

                    

                    'Datos por tipo de órden

                    Select Case tipoOrden

                        Case TiposOrden.DeudaXRango
                            If .LimitYield.Length > 0 Then
                                If (Not IsNumeric(.LimitYield)) Then
                                    sMensajeError = sMensajeError & "El LimitYield es incorrecto " & vbNewLine
                                End If
                            End If

                            If .Tasa.Length > 0 Then
                                Try
                                    Dim td As Double = Convert.ToDouble(.Tasa)
                                Catch ex As Exception
                                    sMensajeError = sMensajeError & "La tasa debe ser un valor numerico " & vbNewLine
                                End Try
                            End If

                            Try
                                Dim fl As Date = Convert.ToDateTime(.FechaLiquidacion)

                                If fl < FechaAux.Date Then
                                    sMensajeError = sMensajeError & "La fecha de liquidación debe ser igual o mayor al día de hoy " & vbNewLine
                                End If
                            Catch ex As Exception
                                sMensajeError = sMensajeError & "Revisar el formato de la fecha de liquidación dd/mm/yyyy " & vbNewLine
                            End Try

                            Try
                                Dim md As Double = Convert.ToDouble(.Monto)
                            Catch ex As Exception
                                sMensajeError = sMensajeError & "El monto debe se nominal " & vbNewLine
                            End Try

                            If (.SecuritySN.Trim.Length <= 0 Or .SecuritySN.Trim.Length > 40) Then
                                sMensajeError = sMensajeError & "Security Short Name incorrecto " & vbNewLine
                            End If

                            If (.MaturityRange.Trim.Length <= 0 Or .MaturityRange.Trim.Length > 13) Then
                                sMensajeError = sMensajeError & "Maturity Range incorrecto " & vbNewLine
                            End If

                            tipoValores.Append("'" & .TipoValor & "'")
                            tipoValores.Append(",")

                        Case TiposOrden.Monto
                            If .LimitYield.Length > 0 Then
                                If (Not IsNumeric(.LimitYield)) Then
                                    sMensajeError = sMensajeError & "El LimitYield es incorrecto " & vbNewLine
                                End If
                            End If

                            If .Tasa.Length > 0 Then
                                Try
                                    Dim td As Double = Convert.ToDouble(.Tasa)
                                Catch ex As Exception
                                    sMensajeError = sMensajeError & "La tasa debe ser un valor numerico " & vbNewLine
                                End Try
                            End If

                            Try
                                Dim fl As Date = Convert.ToDateTime(.FechaLiquidacion)

                                If fl < FechaAux.Date Then
                                    sMensajeError = sMensajeError & "La fecha de liquidación debe ser igual o mayor al día de hoy " & vbNewLine
                                End If
                            Catch ex As Exception
                                sMensajeError = sMensajeError & "Revisar el formato de la fecha de liquidación dd/mm/yyyy " & vbNewLine
                            End Try

                            Try
                                Dim mmd As Double = Convert.ToDouble(.Monto)
                            Catch ex As Exception
                                sMensajeError = sMensajeError & "El monto debe ser numérico " & vbNewLine
                            End Try

                            instrumentos.Append("'" & .TipoValor & "_" & .Emisora & "_" & .Serie & "'")
                            instrumentos.Append(",")

                        Case TiposOrden.Nominal
                            If .LimitYield.Length > 0 Then
                                If (Not IsNumeric(.LimitYield)) Then
                                    sMensajeError = sMensajeError & "El LimitYield es incorrecto " & vbNewLine
                                End If
                            End If

                            If .Tasa.Length > 0 Then
                                Try
                                    Dim td As Double = Convert.ToDouble(.Tasa)
                                Catch ex As Exception
                                    sMensajeError = sMensajeError & "La tasa debe ser un valor numerico " & vbNewLine
                                End Try
                            End If

                            Try
                                Dim fl As Date = Convert.ToDateTime(.FechaLiquidacion)

                                If fl < FechaAux.Date Then
                                    sMensajeError = sMensajeError & "La fecha de liquidación debe ser igual o mayor al día de hoy " & vbNewLine
                                End If
                            Catch ex As Exception
                                sMensajeError = sMensajeError & "Revisar el formato de la fecha de liquidación dd/mm/yyyy " & vbNewLine
                            End Try

                            Try
                                Dim nmd As Double = Convert.ToDouble(.Titulos)
                            Catch ex As Exception
                                sMensajeError = sMensajeError & "Los títulos deben ser en nominal " & vbNewLine
                            End Try

                            instrumentos.Append("'" & .TipoValor & "_" & .Emisora & "_" & .Serie & "'")
                            instrumentos.Append(",")
                    End Select

                    contratos.Append("'" & .Contrato & "'")
                    contratos.Append(",")

                    estrategias.Append("'" & .Estrategia & "'")
                    estrategias.Append(",")


                    .Mensaje = sMensajeError



                End With



            Next



            If (tipoValores.Length > 0) Then
                tipoValores.Remove(tipoValores.Length - 1, 1)
            End If

            If (instrumentos.Length > 0) Then
                instrumentos.Remove(instrumentos.Length - 1, 1)
            End If

            If (contratos.Length > 0) Then
                contratos.Remove(contratos.Length - 1, 1)
            End If

            If (estrategias.Length > 0) Then
                estrategias.Remove(estrategias.Length - 1, 1)
            End If




            '************************************VALIDACIÓN DEL INSTRUMENTO***************************************
            'Tipo Valor: SE OBTIENE DE LA TABLA: ID_INST_TYP DEL CAMPO INST_TYP_ACR_LG
            'Instrumento: SE OBTIENE INSTRUMENT DEL CAMPO INST_SH_NAM
            'Fecha de Vencimiento se obtiene de: INSTRUMENT DEL CAMPO MATURITY_DAT_END


            '************************************GESTION X ESTRATEGIAS***************************************
            'DETERMINAR SI ESTA GESTIONADO: BUSCAR EL FONDO EN LA TABLA PORTFOLIO EN EL CAMPO PF_C_FREE15
            'ESTRATEGIA OBTENIDA DE ID_CODIF EN CODIF_GRP= 'STRATEGY' VARCHAR(30)

            ' CAMPO PARENT = PF_LINKED_PF    (dato cultural para GXE)


            '***********************************VALIDAR CONTRATOS********************************************
            'CONTRATO SE OBTIENE DE PORTFOLIO DEL CAMPO PF_COD


            If tipoOrden = TiposOrden.DeudaXRango
               dtTiposValores = CServiciosMacrosSyBaseDB.ObtenerTiposValorAAA(tipoValores.ToString)
            else
               dtTiposValores  = Nothing 
            End If
            
                     
            dtInstrumentos = CServiciosMacrosSyBaseDB.ObtenerInstrumentosAAA(instrumentos.ToString)
            dtContratosGXE = CServiciosMacrosSyBaseDB.ObtenerContratosGXEAAA(contratos.ToString)
            dtEstrategias = CServiciosMacrosSyBaseDB.ObtenerEstrategiasAAA()
            dtContratos = CServiciosMacrosSyBaseDB.ObtenerContratosAAA(contratos.ToString)

            dtMesas = CServiciosMacrosSyBaseDB.ObtenerMesasAAA () 

            For Each orden As COrden In Ordenes

                sMensajeError = ""
                With orden


                    '0) Validar que exista el contrato en DECALOG

                      Dim regCTO() As DataRow = dtContratos.Select("PF_COD = '" & orden.Contrato   & "'")
                      If regCTO.Length = 0 Then
                        sMensajeError &= "DECALOG: Contrato incorrecto " & vbNewLine
                      End If

                      
                    '1)Validación del Instrumento

                    Select Case tipoOrden

                        Case TiposOrden.DeudaXRango

                            Dim regTV() As DataRow = dtTiposValores.Select("INST_TYP_ACR_LG = '" & .TipoValor & "'")
                            If regTV.Length = 0 Then
                                sMensajeError &= "DECALOG: Tipo de Valor Incorrecto " & vbNewLine
                            End If

                        Case TiposOrden.Monto, TiposOrden.Nominal

                            Dim regINST() As DataRow = dtInstrumentos.Select("INST_SH_NAM = '" & .TipoValor & "_" & .Emisora & "_" & .Serie & "'")
                            If regINST.Length = 0 Then
                                sMensajeError &= "DECALOG: Tipo_de_Valor-Emisora es Incorrecto o el instrumento esta vencido " & vbNewLine
                            End If

                    End Select

                    '2) Validación de GxE

                    Dim regCTOGXE() As DataRow = dtContratosGXE.Select("PF_COD = '" & .Contrato & "'")
                    If regCTOGXE.Length > 0 Then
                        Dim regSTG() As DataRow = dtEstrategias.Select("CODIF_COD = '" & .Estrategia & "'")
                        If regSTG.Length <= 0 Then
                            sMensajeError &= "DECALOG:Se requiere una estrategia valida " & vbNewLine
                        End If

                        'Else                    
                        '    .Estrategia = ""
                    End If

                    
                    '3) Validar Mesas
                     Dim regMESAS() As DataRow = dtMesas.Select("DESK_NAM = '" & .Mesa  & "'")
                     If regMESAS.Length = 0 Then
                        sMensajeError &= "DECALOG: La mesa es incorrecta (no existe en DECALOG) " & vbNewLine
                     End If


                    'Quitar la última coma (,) si aplica
                    'If sMensajeError.Length > 0 Then
                    '    sMensajeError = sMensajeError.Substring(0, sMensajeError.Length - 1)                    
                    'End If

                    .Mensaje &= sMensajeError

                End With
            Next
        Catch ex As Exception
            sMsgError = ex.Message
            Exit Sub
        End Try
    End Sub

    Public Function ObtieneParametrosAPI(ByVal Opcion As Integer) As DataTable
        Return CServicioLocalSQLServerDB.ObtieneParametrosAPI(Opcion)
    End Function

    Public Function ObtieneOrderTypeAlternativo() As String
        Return CServicioLocalSQLServerDB.ObtieneOrderTypeAlternativo()
    End Function
End Class
